#include "ipc_server_base.h"
#include "../log_tool.h"
#include <windows.h>
IpcServerBase::IpcServerBase(unsigned int pipe_size, const std::string &pipe_name)
    : _running(false), _pipe_size(pipe_size), _pipe_name(pipe_name)
{
}
IpcServerBase::~IpcServerBase()
{
    if (_running)
    {
        stop();
    }
}

// 启动服务器
bool IpcServerBase::start(std::function<void(HANDLE)>&& onClientConnected)
{
    if (_running)
        return true;
    _running = true;

    // 启动监听线程
    HANDLE hPipe; // 管道句柄

    while (_running)
    {
        // 创建命名管道
        hPipe = CreateNamedPipeA(
            _pipe_name.c_str(),
            PIPE_ACCESS_DUPLEX,
            PIPE_TYPE_MESSAGE | PIPE_READMODE_MESSAGE | PIPE_WAIT,
            PIPE_UNLIMITED_INSTANCES,
            _pipe_size, // 输出缓冲区大小
            _pipe_size, // 输入缓冲区大小
            0,                // 默认超时时间
            NULL);

        if (hPipe == INVALID_HANDLE_VALUE)
        {
            LOG_ERROR("创建管道失败: %d", GetLastError());
            break;
        }

        // 等待客户端连接
        if (ConnectNamedPipe(hPipe, NULL) || GetLastError() == ERROR_PIPE_CONNECTED)
        {
            LOG_INFO("客户端已连接");
            // 为每个客户端创建独立线程处理
            onClientConnected(hPipe);
        }
        else
        {
            CloseHandle(hPipe);
        }
    }
    _running = false;
    return false;
}
// 停止服务器
void IpcServerBase::stop()
{
    if (!_running)
        return;
    _running = false;
}

